bootstrap <- function(data, tv, cv, group_c = "Target_Type", group_t, n_iter, n_samp) {  
                                               #data：需数据框格式, tv：处理变量, cv：对照变量, group_c：对照分组（默认物种）, group_t：处理分组, n_iter：迭代次数, n_samp：抽样数
  library(plyr)                                #dlply拆分数据框
  library(data.table)                          #data.table包tstrsplit、rbindlist函数
  
  group <- c(group_t, group_c)                 #分组变量
  
  data_c <- dlply(data, group_c)               #按组将数据拆分进list
  C_names <- names(data_c)                     #将分组组合
  C_g <- as.data.frame(tstrsplit(C_names, ".", fixed=TRUE))
                                               #分组组合拆为数据框
  names(C_g) <- group_c                        #命名分组数据框列名
  Mc <- list()                                 #对照均值list
  for (i in c(1:length(data_c))) {             #按分组数循环
    set.seed(1234)                             #设置抽样种子，防止多次运算结果存在差异
    S <- replicate(n_iter, sample(data_c[[i]][cv][,1], n_samp, replace = TRUE)) 
                                               #n_iter次迭代，放回抽样n_samp次的结果，矩阵S
    Mc[[i]] <- cbind(data.frame(C_g[i,]) ,apply(S, 2, mean, na.rm=TRUE), row.names = NULL)
                                               #对矩阵S求平均数，并添加分组变量作为list中的数据框
    names(Mc[[i]]) <- c(group_c, "v")          #给数据框命名
  }
  Mc <- as.data.frame(rbindlist(Mc))           #对照均值list转数据框
  
  data_t <- dlply(data, group)                 #按组将数据拆分进list
  T_names <- names(data_t)                     #将分组组合
  T_g <- as.data.frame(tstrsplit(T_names, ".", fixed=TRUE))
                                               #分组组合拆为数据框
  names(T_g) <- group                          #命名分组数据框列名
  Mt <- list()                                 #处理均值list
  for (i in c(1:length(data_t))) {             #按分组数循环
    set.seed(1234)                             #设置抽样种子，防止多次运算结果存在差异
    M <- replicate(n_iter, sample(data_t[[i]][tv][,1], n_samp, replace = TRUE))
                                               #n_iter次迭代，放回抽样n_samp次的结果，矩阵S
    Mt[[i]] <- cbind(data.frame(T_g[i,]) ,apply(M, 2, mean, na.rm=TRUE), row.names = NULL)
                                               #对矩阵S求平均数，并添加分组变量作为list中的数据框
    names(Mt[[i]]) <- c(group, "v")            #给数据框命名
  }
  
  E <- list()                                  #效应list
  for (i in c(1:length(Mt))) {                 #按分组数循环
    E[[i]] <- cbind(data.frame(T_g[i,]), Mt[[i]]$v - Mc[Mc[group_c] == as.character(unique(Mt[[i]][group_c])), "v"], row.names = NULL)
    names(E[[i]]) <- c(group, "E")             #给数据框命名
  }
  return(E)
}